package com.adee.java;

import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Type;
import java.util.List;

/**
 * GenericArrayType 泛型数组类型
 * 描述的是形如：A[]（参数化类型数组）或者T[]（类型变量数组）。
 * 它的组成元素是ParameterizedType或TypeVariable类型。
 *
 * 无论从左向右右几个[]并列，这个方法仅仅脱去最右边的[]之后剩下的内容就作为这个方法的返回值。
 *
 * public interface GenericArrayType extends Type {
 *     // 返回泛型数组中成员类型，即List<String>[]中的List<String>
 *     Type getGenericComponentType();
 * }
 *
 *
 * 字段名：value，泛型类型：T[]，是否为泛型数组：true，数组元素类型：T
 * 字段名：lists，泛型类型：java.util.List<java.lang.String>[]，是否为泛型数组：true，数组元素类型：java.util.List<java.lang.String>
 * 字段名：list，泛型类型：java.util.List<java.lang.String>，是否为泛型数组：false
 * 字段名：singleValue，泛型类型：T，是否为泛型数组：false
 *
 */
public class Test036_GenericArrayType {
    public static void main(String[] args) {
        Field[] declaredFields = Person.class.getDeclaredFields();
        for (Field f : declaredFields) {
            Type genericType = f.getGenericType();
            System.out.printf("字段名：%s，泛型类型：%s，是否为泛型数组：%s",
                    f.getName(),
                    genericType.getTypeName(),
                    genericType instanceof GenericArrayType);
            if(genericType instanceof GenericArrayType) {
                GenericArrayType gat = (GenericArrayType) genericType;
                System.out.printf("，数组元素类型：%s", gat.getGenericComponentType());
            }
            System.out.println();
        }
    }

    static class Person<T> {
        // 泛型数组类型
        private T[] value;
        private List<String>[] lists;

        // 非泛型数组类型
        private List<String> list;
        private T singleValue;
    }
}
